// SPDX-License-Identifier: GPL-2.0-or-later

#include "fqterm_filedialog.h"
#include "fqterm_trace.h"
#include "fqterm_path.h"
#include "fqterm_config.h"

/* 
 *  Constructs a articleDialog as a child of 'parent', with the 
 *  name 'name' and widget flags set to 'f'.
 *
 *  The dialog will by default be modeless, unless you set 'modal' to
 *  TRUE to construct a modal dialog.
 */

namespace FQTerm {

FQTermFileDialog::FQTermFileDialog(FQTermConfig *config, QWidget *parent)
    : QFileDialog(parent) {

	configDir = getPath(USER_CONFIG) + "/";
	userConfig = configDir + "fqterm.cfg";
	strSection = "previous";
	strSave = "save";
	strOpen = "open";
	config_ = config;
}

/*
 *  Destroys the object and frees any allocated resources
 */
FQTermFileDialog::~FQTermFileDialog() {
	// no need to delete child widgets, Qt does it all for us
}



QString FQTermFileDialog::getSaveName(const QString &fileToSave, const QString &hints, QWidget *widget) {
	QString saveFile;
	QString strPrevSave, saveName;
	QFileDialog fileDialog(widget);

	if (config_!=NULL && config_->load(userConfig)) {
		strPrevSave = config_->getItemValue(strSection, strSave);
	}

	QString strTmp(fileToSave);
#if !defined(Q_OS_WIN32) || !defined(_OS_WIN32_)
	if (strTmp.toLocal8Bit().contains("/")) {
		strTmp.replace(QString("/"), QString("_"));
	}
#endif

	if (strPrevSave.isEmpty()) {
		saveFile = configDir + strTmp;
	} else {
		saveFile = strPrevSave + "/" + strTmp;
	}

	QString realHints = (hints.isEmpty() ? "*" : hints);
	saveName = fileDialog.getSaveFileName(widget,
					      tr("Save As..."),
					      saveFile, realHints);

	QFileInfo fi(saveName);

	if (config_!=NULL && !saveName.isEmpty()) {
		config_->setItemValue(strSection, strSave, fi.absolutePath());
		config_->save(userConfig);
	}

	return saveName;
}

QString FQTermFileDialog::getOpenName(const QString &title, const QString &hints, QWidget *widget) {
	QString strPrevOpen;
	QString openName;
	QFileDialog fileDialog(widget);

	if (config_!=NULL){
		strPrevOpen = (config_->load(userConfig) ? config_->getItemValue(strSection, strOpen) : "./");
	}

	QString realHints = (hints.isEmpty() ? "*" : hints);
	QString realTitle = (title.isEmpty() ? "Choose a file to open" : title);
	openName = fileDialog.getOpenFileName(widget, realTitle, strPrevOpen, realHints);

	if (config_!=NULL && !openName.isEmpty()) {
		config_->setItemValue(strSection, strOpen, QFileInfo(openName).absolutePath());
		config_->save(userConfig);
	}

	return openName;
}

QStringList FQTermFileDialog::getOpenNames(const QString &title, const QString &hints, QWidget *widget) {
	QString openDir, strPrevOpen;

	QString realHints = (hints.isEmpty() ? "*" : hints);
	QString realTitle = (title.isEmpty() ? "Choose files to open" : title);
	if (config_!=NULL){
		strPrevOpen = (config_->load(userConfig) ? config_->getItemValue(strSection, strOpen) : "./");
	}

	QFileDialog * p_dlg =  new QFileDialog(widget , realTitle , strPrevOpen , realHints );

	p_dlg->open();

	connect( p_dlg , &QFileDialog::filesSelected , [=]{
		QStringList openNames;
		QString dir;
		openNames = p_dlg->selectedFiles();

		if (config_!=NULL && !openNames.isEmpty() && !openNames.at(0).isEmpty()) {
			dir = QFileInfo(openNames.at(0)).absolutePath();
			config_->setItemValue(strSection, strOpen, dir);
			config_->save(userConfig);
			emit selectedFiles( true , openNames );
		}else{
			emit selectedFiles( false , openNames);
		}
		p_dlg->close();
	});

    connect( p_dlg , &QFileDialog::rejected , [=]{
        QStringList openNames;
            emit selectedFiles( false , openNames);
        p_dlg->close();
    });

	return {};
}

QString FQTermFileDialog::getExistingDirectory(const QString &title, const QString &hints, QWidget *widget) {

	QString strPrevOpen;
	QFileDialog fileDialog(widget);

	if (config_!=NULL && hints.isEmpty()) {
		strPrevOpen = (config_->load(userConfig) ? config_->getItemValue(strSection, strOpen) : "./");
	} else {
		strPrevOpen = hints;
	}

	QString realTitle = (title.isEmpty() ? "Open a directory" : title);
	QString dir = fileDialog.getExistingDirectory(widget,
						      realTitle,
						      strPrevOpen,
						      QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

	if (config_!=NULL && !dir.isEmpty()) {
		config_->setItemValue(strSection, strOpen, QFileInfo(dir).absolutePath());
		config_->save(userConfig);
	}

	return dir;
}

} // namespace FQTerm
